public class J如何求二进制数中1的个数 {
    /**
     * 题目描述：给定一个整数，输出这个整数的二进制表示中1的个数。
     * 例如，给定整数7，其二进制表示为111，因此输出结果为3
     */


    /**
     * 可以采用位操作来完成。具体思路如下：首先，判断这个数的最后一位是否为1，如果为1，则计数器加1。
     * 然后，通过右移丢弃掉最后一位，循环执行该操作直到这个数等于0为止。
     * 在判断二进制表示的最后一位是否为1时，可以采用“与”运算来达到这个目的
     */
    private static class  A移位法{

        public static int countOne(int n){
            int count=0; //用来计数
            while (n > 0) {
                if ((n & 1)==1) {//判断最后一位是否为1
                    count++;
                }
                n>>=1;//移位丢掉最后一位
            }
            return count;
        }
        public static void main(String[] args) {
            System.out.println(countOne(-3));
        }
    }


    /**
     * 给定一个数n，每进行一次n&（n-1）计算，其结果中都会少了一位1，
     * 而且是最后一位。例如，n=6，其对应的二进制表示为110；
     * n-1=5，对应的二进制表示为101；n&（n-1）运算后的二进制表示为100，
     * 其效果就是去掉了110中最后一位1。
     * 可以通过不断地用n&（n-1）操作去掉n中最后一位1的方法求出n中1的个数
     */
    private static class B与操作法{
        public static int countOne(int n){
            int count=0;//用来计数
            while (n > 0) {
                if (n != 0) {//判断最后一位是否为1
                    n=n&(n-1);
                }
                count++;
            }
            return count;
        }
        public static void main(String[] args) {
            System.out.println(countOne(7));
            System.out.println(countOne(8));
        }
    }
}
